package test;
public class CalcFunction {
        private String result;
    
        public void calc(String s){
        	if(s.indexOf("+")>-1){
        		int i=s.indexOf("+");
        		if(s.indexOf("+",i+1)==i+1){
        			throw new IllegalArgumentException("Input error! Don't like 1++1");//格式错误时抛出异常
        			}else{
        				add(s);
        				}
        		}
            if(s.indexOf("-")>-1){
                	int i=s.indexOf("-");            
                    if(s.indexOf("-",i+1)==i+1){           
                    	throw new IllegalArgumentException("Input error! Don't like 1++1");//格式错误时抛出异常
                       }else{
                    	   substract(s);
                       }
                
            }
            if(s.indexOf("*")>-1){
                	int i=s.indexOf("*");
                	
                    if(s.indexOf("*",i+1)==i+1){           
                    	throw new IllegalArgumentException("Input error! Don't like 1++1");//格式错误时抛出异常
                       }else{
                    	   multiply(s);
                       }     
            }
            if(s.indexOf("÷")>-1){
                	int i=s.indexOf("÷");  
                	
                    if(s.indexOf("÷",i+1)==i+1){           
                    	throw new IllegalArgumentException("Input error! Don't like 1++1");//格式错误时抛出异常
                       }else{
                    	   divide(s);
                       } 
            }
            
            
            if(s.indexOf("^")>-1){
        		int i=s.indexOf("^");
        		
        		if(s.indexOf("^",i+1)==i+1){
        			throw new IllegalArgumentException("Input error! Don't like 1++1");//格式错误时抛出异常
        			}else{
        				
        				power(s);
        				}
        		}
            
            if(s.indexOf("#")>-1){
        		int i=s.indexOf("#");
        		
        		if(s.indexOf("#",i+1)==i+1){
        			throw new IllegalArgumentException("Input error! Don't like 1++1");//格式错误时抛出异常
        			}else{
        				
        				sqrt(s);
        				}
        		}
            
         
            System.out.println(getResult());
        }
        
        
        public void add(String s)//加法
        {
            String[] str=s.split("[+]");
            if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)//分数
            {
            	String[] str1=str[0].split("[/]");
            	String[] str2=str[1].split("[/]");
            	if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0)//分母不为零
            	{
            		result =simplefraction(((Integer.parseInt(str1[0])*Integer.parseInt(str1[1]))+(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1])));      	
            	}else{
            		throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
            	}
            }
            else{//整数
     	       if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                {	           
     	    	   result = Integer.parseInt(str[0])+Integer.parseInt(str[1])+""; 
     	    	   }       	
            
           else{
        	   throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
           } 
            
        }
        
        public void substract(String s)//减法
        {
            String[] str=s.split("[-]");
            if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)//分数
            {
            	String[] str1=str[0].split("[/]");
            	String[] str2=str[1].split("[/]");
            	if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0)//分母不为零
            	{
            		result =simplefraction(((Integer.parseInt(str1[0])*Integer.parseInt(str2[1]))-(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1])));    	
            	}else{
            		throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
            	}
            }
            else{//整数
           if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                {
        	   result = Integer.parseInt(str[0])-Integer.parseInt(str[1])+"";
        	   }       	
            
           else{
        	   throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
           }
        }
        
        
        public void multiply(String s)//乘法
        {
            String[] str=s.split("[*]");
            if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)//分数
            {
            	String[] str1=str[0].split("[/]");
            	String[] str2=str[1].split("[/]");
            	if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0)//
            	{
                	result =simplefraction(Integer.parseInt(str1[0])*Integer.parseInt(str2[0]),Integer.parseInt(str1[1])*Integer.parseInt(str2[1]));    	
            	}else{
            		throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
            	}
      
            }
            else{//整数
         	       if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                    {	            result = Integer.parseInt(str[0])*Integer.parseInt(str[1])+"";   }       	
                
               else{
            	   throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
            	
            	}
        }
        
        
        public void divide(String s)//除法
        {
            String[] str=s.split("[÷]");
            
            if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)//分数
            {
            	String[] str1=str[0].split("[/]");
            	String[] str2=str[1].split("[/]");
            	if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0)//分母不为零
            	{
                	result =simplefraction(Integer.parseInt(str1[0])*Integer.parseInt(str2[1]),Integer.parseInt(str1[1])*Integer.parseInt(str2[0]));  	
            	}else{
            		throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
            	}
      
            }else{
            	if(Integer.parseInt(str[1]) != 0){//整数
             	       if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                        {	            
             	    	   result = Integer.parseInt(str[0])/Integer.parseInt(str[1])+"";
                        }       	
                    
                   else{
                	   throw new IllegalArgumentException("overrun!");}
                             		
            	}else {
            		
            		throw new IllegalArgumentException("Divisor cannot be zero!");   //除数为零时抛出异常  	
            	}
            }
        }
        
        
        public void power(String s)//乘方
        {
        	
            String[] str=s.split("\\^");
            
            int number=Integer.parseInt(str[1]);
            
            if(str[0].indexOf("/")>-1 )//分数
            {
            	String[] str1=str[0].split("[/]");
            	
            	if(Integer.parseInt(str1[1]) != 0 )//分母不为零
            	{
            		int a=1;
                	int b=1;
            		for(int i=0;i<number;i++){
            			a=a*Integer.parseInt(str1[0]);
            			b=b*Integer.parseInt(str1[1]);
            		}
            		result=simplefraction(a,b);
            	  	
            	}else{
            		throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
            	}
            }
            else{//整数
     	       if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                {	       
     	    	   int c=1;
     	    	   for(int i=0;i<number;i++){
     	    		   c=c*Integer.parseInt(str[0]);
     	    	   }
     	    	   
     	    	   result = c+""; 
     	    	   }       	
            
           else{
        	   throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
           } 
            
        }
    
        
        public void sqrt(String s)//根号
        {
        	
            String[] str=s.split("\\#");
            
            
            if(str[0].indexOf("/")>-1 )//分数
            {
            	String[] str1=str[0].split("\\/");
            	
            	if(Integer.parseInt(str1[1]) != 0 )//分母不为零
            	{
            		
            		int a=Integer.parseInt(str1[0]);
            		int b=Integer.parseInt(str1[1]);
            		double a1=Math.sqrt(a);
            		double b1=Math.sqrt(b);
            		a=(int)a1;
            		b=(int)b1;
            		
            	
            		result=simplefraction(a,b);
            	  	
            	}else{
            		throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
            	}
            }
            else{//整数
     	       if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                {	       
     	    	   int c=Integer.parseInt(str[0]);
     	    	   double c1=Math.sqrt(c);
     	    	   c=(int)c1;
     	    	   result = c+""; 
     	    	   }       	
            
           else{
        	   throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
           } 
            
        }
    
        
        
        
        
        
        
    public String getResult()
    {
        return result;
    } 
        
    
    public static int GCD(int m, int n) {//递归法求最大公约数
        if(m % n == 0){
            return n;
        }else{
            while(m != n){
                if(m > n)m = m - n;
                else n = n - m;
            }
        }
        return m;
}
    public static int LCM(int m, int n){//求最小公倍数
        return m * n / GCD(m,n);
    }
    
    static String simplefraction(int m, int n){ //化简分数
    String s;
    int num = GCD(m, n);
            m = m / num;
            n = n / num;
    if (n == 1) {
        s = m + "";
    } else {
        s = m + "" + "/" + n + "";
    }
    return s;
}
    
}